﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using AutoLoL.Entities;
using AutoLoL.Logic.Parsers;
using AutoLoL.Logic.Utils;
using AutoLoL.Shared;

namespace AutoLoL.Logic.Repositories
{
    public class LocalSummonerSpellRepository : ISummonerSpellRepository
    {
        private ReadOnlyCollection<SummonerSpell> _summonerSpells;

        public LocalSummonerSpellRepository()
        {
        }

        public SummonerSpell GetByName(string summonerSpellName, IMasteryRepository masteryRepository)
        {
            if (string.IsNullOrEmpty(summonerSpellName))
            {
                return null;
            }

            return GetAll(masteryRepository).Where(c => c.Name.ToLower().Equals(summonerSpellName.ToLower())).SingleOrDefault();
        }

        public ReadOnlyCollection<SummonerSpell> GetAll(IMasteryRepository masteryRepository)
        {
            if (_summonerSpells != null)
            {
                return _summonerSpells;
            }

            List<SummonerSpell> summonerSpells = new List<SummonerSpell>();

            if (File.Exists(Constants.SPELLS_XML_FILE))
            {
                XDocument itemsDoc = XDocument.Load(Constants.SPELLS_XML_FILE);
                foreach (XElement spellElement in itemsDoc.Root.Elements("spell"))
                {
                    string name = spellElement.Element("name").Value;
                    string icon = spellElement.Element("icon").Value;
                    string description = spellElement.Element("description").Value;
                    int masteryId = int.Parse(spellElement.Element("mastery").Value);

                    string iconPath = Path.Combine(Constants.SPELLS_DIRECTORY, icon);

                    SummonerSpell summonerSpell = new SummonerSpell();
                    summonerSpell.Name = name;
                    summonerSpell.IconBitmapImage = ImageParser.FileToBitmapImage(iconPath);
                    summonerSpell.Description = description;
                    summonerSpell.Mastery = masteryRepository.GetMasteryById(masteryId);

                    summonerSpells.Add(summonerSpell);
                }
            }

            _summonerSpells = new ReadOnlyCollection<SummonerSpell>(summonerSpells);

            return _summonerSpells;
        }
    }
}